package com.hyjx.framework.common.util;

import com.swetake.util.Qrcode;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.OutputStream;


public class QRCodeUtil {

    private static final int DEFAULT_SIZE = 7;
    public static final String JPEG = "jpeg";
    public static final String PNG = "png";
    public static final String GIF = "gif";


    /**
     * @param content 存储内容
     * @param imgType 图片类型
     * @return
     */
    public static byte[] encoderQRCodeAsByteArray(String content, String imgType) {
        return encoderQRCodeAsByteArray(content, imgType, DEFAULT_SIZE);
    }

    /**
     * @param content 存储内容
     * @param output  输出流
     * @param imgType 图片类型
     */
    public static void encoderQRCodeAsOutputStream(String content, OutputStream output, String imgType) {
        encoderQRCodeAsOutputStream(content, output, imgType, DEFAULT_SIZE);
    }

    /**
     * @param content 存储内容
     * @param imgType 图片类型
     * @param size    二维码尺寸
     * @return
     */
    public static byte[] encoderQRCodeAsByteArray(String content, String imgType, int size) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            BufferedImage bufImg = qRCodeCommon(content, imgType, size);
            //bufImg = QRCodeUtil.createQRCode(new String("1234567中文".getBytes("iso8859-1"),"utf-8"), "d:\\12.jpg", 12);
            // 生成二维码QRCode图片
            ImageIO.write(bufImg, imgType, out);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return out.toByteArray();
    }

    public static byte[] encoderQRCodeAsByteArray(String content, String imgType, int size, String logo) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            BufferedImage bufImg = null;
            bufImg = QRCodeUtil.createQRCodeWithLogo(content, logo, 12);
            // 生成二维码QRCode图片
            ImageIO.write(bufImg, imgType, out);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return out.toByteArray();
    }

    /**
     * @param content 存储内容
     * @param output  输出流
     * @param imgType 图片类型
     * @param size    二维码尺寸
     */
    public static void encoderQRCodeAsOutputStream(String content, OutputStream output, String imgType, int size) {
        try {
            BufferedImage bufImg = qRCodeCommon(content, imgType, size);
            // 生成二维码QRCode图片
            ImageIO.write(bufImg, imgType, output);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成二维码(QRCode)图片的公共方法
     *
     * @param content 存储内容
     * @param imgType 图片类型
     * @param size    二维码尺寸
     * @return
     */
    private static BufferedImage qRCodeCommon(String content, String imgType, int size) {
        BufferedImage bufImg = null;
        try {
            Qrcode qrcodeHandler = new Qrcode();
            // 设置二维码排错率，可选L(7%)、M(15%)、Q(25%)、H(30%)，排错率越高可存储的信息越少，但对二维码清晰度的要求越小
            qrcodeHandler.setQrcodeErrorCorrect('M');
            qrcodeHandler.setQrcodeEncodeMode('B');
            // 设置设置二维码尺寸，取值范围1-40，值越大尺寸越大，可存储的信息越大
            qrcodeHandler.setQrcodeVersion(size);
            // 获得内容的字节数组，设置编码格式
            byte[] contentBytes = content.getBytes("utf-8");
            // 图片尺寸
            int imgSize = 67 + 12 * (size - 1);
            bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
            Graphics2D gs = bufImg.createGraphics();
            // 设置背景颜色
            gs.setBackground(Color.WHITE);
            gs.clearRect(0, 0, imgSize, imgSize);

            // 设定图像颜色> BLACK
            gs.setColor(Color.BLACK);
            // 设置偏移量，不设置可能导致解析出错
            int pixoff = 2;
            // 输出内容> 二维码
            if (contentBytes.length > 0 && contentBytes.length < 800) {
                boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
                for (int i = 0; i < codeOut.length; i++) {
                    for (int j = 0; j < codeOut.length; j++) {
                        if (codeOut[j][i]) {
                            gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
                        }
                    }
                }
            } else {
                throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");
            }
            gs.dispose();
            bufImg.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bufImg;
    }


    /**
     * 生成二维码(QRCode)图片
     *
     * @param content 二维码图片的内容
     * @param ccbpath 二维码图片中间的logo路径
     *                size 大小
     */
    public static BufferedImage createQRCodeWithLogo(String content, String ccbPath, int size) {

        try {
            Qrcode qrcodeHandler = new Qrcode();
            qrcodeHandler.setQrcodeErrorCorrect('M');
            qrcodeHandler.setQrcodeEncodeMode('B');
            qrcodeHandler.setQrcodeVersion(7);
            byte[] contentBytes = content.getBytes("utf-8");
            BufferedImage bufImg = new BufferedImage(140, 140,
                    BufferedImage.TYPE_INT_RGB);
            Graphics2D gs = bufImg.createGraphics();
            gs.setBackground(Color.WHITE);
            gs.clearRect(0, 0, 140, 140);
            // 设定图像颜色 > BLACK
            gs.setColor(Color.BLACK);
            // 设置偏移量 不设置可能导致解析出错  
            int pixoff = 2;
            // 输出内容 > 二维码  
            if (contentBytes.length > 0 && contentBytes.length < 120) {
                boolean[][] codeOut =
                        qrcodeHandler.calQrcode(contentBytes);
                for (int i = 0; i < codeOut.length; i++) {
                    for (int j = 0; j < codeOut.length; j++) {
                        if (codeOut[j][i]) {
                            gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
                        }
                    }
                }
            } else {
                System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,120 ]. ");
                return null;
            }
            Image img = ImageIO.read(new File(ccbPath));
            //实例化一个Image对象。
            gs.drawImage(img, 45, 45, null);
            gs.dispose();
            bufImg.flush();
            //实例化一个Image对象。
            gs.drawImage(img, 45, 45, null);
            gs.dispose();
            bufImg.flush();
            return bufImg;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    public static void main(String[] args) {

//		byte[] qrbytes = QRCodeUtil.encoderQRCodeAsByteArray("hello你好", QRCodeUtil.PNG);
//		try {
//			FileImageOutputStream fos = new FileImageOutputStream(new File("d:\\temp."+QRCodeUtil.PNG));
//			fos.write(qrbytes, 0, qrbytes.length);
//			fos.close();
//		} catch (FileNotFoundException e) {
//			e.printStackTrace();
//		} catch (IOException e) {
//			e.printStackTrace();
//		}

    }
}
